﻿// 105 所驼门王的宝藏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using  namespace std;

/*

http://oj.daimayuan.top/course/23/problem/947
在宽广的非洲荒漠中，生活着一群勤劳勇敢的羊驼家族。
被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖，外人也称其为“所驼门王”。
所驼门王毕生致力于维护家族的安定与和谐，他曾亲自率军粉碎河蟹帝国主义的野蛮侵略，为族人立下赫赫战功。
所驼门王一生财宝无数，但因其生性节俭低调，他将财宝埋藏在自己设计的地下宫殿里，这也是今天Henry Curtis故事的起点。
Henry是一个爱财如命的贪婪家伙，而又非常聪明，他费尽心机谋划了这次盗窃行动，破解重重机关后来到这座地下宫殿前。

整座宫殿呈矩阵状，由R×C间矩形宫室组成，其中有N间宫室里埋藏着宝藏，称作藏宝宫室。宫殿里外、相邻宫室间都由坚硬的实体墙阻隔，
由一间宫室到达另一间只能通过所驼门王独创的移动方式——传送门。所驼门王为这N间藏宝宫室每间都架设了一扇传送门，
没有宝藏的宫室不设传送门，所有的宫室传送门分为三种：

“横天门”：由该门可以传送到同行的任一宫室；

“纵寰门”：由该门可以传送到同列的任一宫室；

“任意门”：由该门可以传送到以该门所在宫室为中心周围8格中任一宫室（如果目标宫室存在的话）。

深谋远虑的Henry当然事先就搞到了所驼门王当年的宫殿招标册，书册上详细记录了每扇传送门所属宫室及类型。
而且，虽然宫殿内外相隔，但他自行准备了一种便携式传送门，可将自己传送到殿内任意一间宫室开始寻宝，并在任意一间宫室结束后传送出宫。
整座宫殿只许进出一次，且便携门无法进行宫室之间的传送。不过好在宫室内传送门的使用没有次数限制，每间宫室也可以多次出入。

现在Henry已经打开了便携门，即将选择一间宫室进入。为得到尽多宝藏，他希望安排一条路线，使走过的不同藏宝宫室尽可能多。
请你告诉Henry这条路线最多行经不同藏宝宫室的数目。

输入格式
第一行包含三个正整数N,R,C(1≤N≤105,1≤R,C≤106)。

以下N行，每行给出一扇传送门的信息，包含三个正整数xi,yi,Ti，表示该传送门设在位于第xi行第yi列的藏宝宫室，类型为Ti。
Ti是一个1∼3间的整数，1表示可以传送到第xi行任意一列的“横天门”，2表示可以传送到任意一行第yi列的“纵寰门”，
3表示可以传送到周围8格宫室的“任意门”。

保证1≤xi≤R,1≤yi≤C，所有的传送门位置互不相同。

输出格式
一个正整数，表示你确定的路线所经过不同藏宝宫室的最大数目。

样例输入
10 7 7
2 2 1
2 4 2
1 7 2
2 7 3
4 2 2
4 4 1
6 7 3
7 7 1
7 5 2
5 2 1
样例输出
9
*/

/*

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 301000;
vector<int> e[N];

int n, R, C, x[N], y[N], ty[N], cnt;
map<int, vector<int>> r, c;
map<int, int> rid, cid;
map<pair<int, int>, int> id;

int dfn[N], low[N], ins[N], bel[N], idx;
stack<int> stk;
int dp[N], ans;

void dfs(int u) {
	dfn[u] = low[u] = ++idx;
	ins[u] = true;
	stk.push(u);
	for (auto v : e[u]) {
		if (!dfn[v]) dfs(v);
		if (ins[v]) low[u] = min(low[u], low[v]);
	}
	if (dfn[u] == low[u]) {
		++cnt;
		int sz = 0;
		dp[cnt] = 0;
		while (true) {
			int v = stk.top();
			ins[v] = false;
			bel[v] = cnt;
			sz += (v <= n);
			for (int w : e[v]) if (bel[w] != cnt && bel[w] != 0) {
				dp[cnt] = max(dp[cnt], dp[bel[w]]);
			}
			stk.pop();
			if (v == u) break;
		}
		dp[cnt] += sz;
		ans = max(ans, dp[cnt]);
	}
}

int main() {
	scanf("%d%d%d", &n, &R, &C);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d%d", x + i, y + i, ty + i);
		id[make_pair(x[i], y[i])] = i;
		r[x[i]].push_back(i);
		c[y[i]].push_back(i);
	}
	int tot = n;
	for (int i = 1; i <= n; i++) {
		if (ty[i] == 1) {
			if (!rid.count(x[i])) {
				rid[x[i]] = ++tot;
				for (auto id : r[x[i]]) e[tot].push_back(id);
			}
			e[i].push_back(rid[x[i]]);
		} else if (ty[i] == 2) {
			if (!cid.count(y[i])) {
				cid[y[i]] = ++tot;
				for (auto id : c[y[i]]) e[tot].push_back(id);
			}
			e[i].push_back(cid[y[i]]);
		} else if (ty[i] == 3) {
			for (int dx = -1; dx <= 1; dx++)
				for (int dy = -1; dy <= 1; dy++) {
					if (dx == 0 && dy == 0) continue;
					if (!id.count(make_pair(x[i] + dx, y[i] + dy))) continue;
					e[i].push_back(id[make_pair(x[i] + dx, y[i] + dy)]);
				}
		}
	}
	for (int i = 1; i <= tot; i++)
		if (!dfn[i]) dfs(i);
	printf("%d\n", ans);
}

*/

int main()
{
    std::cout << "Hello World!\n";
}

 